/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package amanda_gabriel_isabella_lucivania_monica.Model.Pojo;

import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

/**
 * Entidade Turma
 *
 * @author lucy
 */
@Entity
@Table(name = "Turma")
@PrimaryKeyJoinColumn(name = "fk_id_turma", referencedColumnName = "id_turma")
public class Turma implements Serializable {

    @Transient
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_turma", unique = true, nullable = false)
    private int id;
    private int ano;
    private int periodo;
    private String lugar;
    private String horario;
    private int numeroVagas;
    @ManyToMany
    @JoinTable(name = "Professor_Turma",
    joinColumns = {
        @JoinColumn(name = "turma_id")},
    inverseJoinColumns = {
        @JoinColumn(name = "professor_id")})
    @JoinColumn(name = "professor_id")
    private List<Professor> professor = new ArrayList<Professor>();
    @JoinColumn(name = "fk_id_disciplina", referencedColumnName = "id_disciplina")
    @ManyToOne
    private Disciplina disciplina;
    @OneToMany(mappedBy = "turma")
    private List<Atividade> atividade = new ArrayList<Atividade>();
    @OneToMany(mappedBy = "turma")
    private List<Faltas> faltas = new ArrayList<Faltas>();

    /**
     * Construtor sem parâmetros de Turma
     */
    public Turma() {
    }

    /**
     * Construtor com parâmetros de Turma
     *
     * @param ano
     * @param periodo
     * @param lugar
     * @param horario
     * @param numeroVagas
     * @param professor
     * @param disciplina
     */
    public Turma(int ano, int periodo, String lugar, String horario, int numeroVagas, List<Professor> professores, Disciplina disciplina) {
        this.ano = ano;
        this.periodo = periodo;
        this.lugar = lugar;
        this.horario = horario;
        this.numeroVagas = numeroVagas;
        this.disciplina = disciplina;
        this.professor = professores;
        disciplina.setNumeroTurmasOferecidas();
    }

    public int getNumeroVagas() {
        return numeroVagas;
    }

    public void setNumeroVagas(int numeroVagas) {
        int oldNumeroVagas = this.numeroVagas;
        this.numeroVagas = numeroVagas;
        changeSupport.firePropertyChange("numeroVagas", oldNumeroVagas, numeroVagas);
    }

    public List<Atividade> getAtividade() {
        return atividade;
    }

    public void setAtividade(List<Atividade> atividade) {
        this.atividade = atividade;
    }

    public List<Faltas> getFaltas() {
        return faltas;
    }

    public void setFaltas(List<Faltas> faltas) {
        this.faltas = faltas;
    }

    /**
     * Retorna uma lista de professores referente à Turma
     *
     * @return
     */
    public List<Professor> getProfessor() {
        return professor;
    }

    /**
     * Seta uma lista de professores referente à Turma
     *
     * @param professor
     */
    public void setProfessor(List<Professor> professor) {
        this.professor = professor;
    }

    /**
     * Retorna a disciplina referente à Turma
     *
     * @return
     */
    public Disciplina getDisciplina() {
        return disciplina;
    }

    /**
     * Seta a disciplina referente à Turma
     *
     * @param disciplina
     */
    public void setDisciplina(Disciplina disciplina) {
        Disciplina oldDisciplina = this.disciplina;
        this.disciplina = disciplina;
        changeSupport.firePropertyChange("disciplina", oldDisciplina, disciplina);
    }

    /**
     * Retorna o ano
     *
     * @return
     */
    public int getAno() {
        return ano;
    }

    /**
     * Seta o ano
     *
     * @param ano
     */
    public void setAno(int ano) {
        int oldAno = this.ano;
        this.ano = ano;
        changeSupport.firePropertyChange("ano", oldAno, ano);
    }

    /**
     * Retorna o período
     *
     * @return
     */
    public int getPeriodo() {
        return periodo;
    }

    /**
     * Seta o período
     *
     * @param periodo
     */
    public void setPeriodo(int periodo) {
        int oldPeriodo = this.periodo;
        this.periodo = periodo;
        changeSupport.firePropertyChange("periodo", oldPeriodo, periodo);
    }

    /**
     * Retorna o lugar (sala da turma, por exemplo)
     *
     * @return
     */
    public String getLugar() {
        return lugar;
    }

    /**
     * Seta o lugar (sala da turma, por exemplo)
     *
     * @param lugar
     */
    public void setLugar(String lugar) {
        String oldLugar = this.lugar;
        this.lugar = lugar;
        changeSupport.firePropertyChange("lugar", oldLugar, lugar);
    }

    /**
     * Retorna o horario
     *
     * @return
     */
    public String getHorario() {
        return horario;
    }

    /**
     * Seta o horario
     *
     * @param horario
     */
    public void setHorario(String horario) {
        String oldHorario = this.horario;
        this.horario = horario;
        changeSupport.firePropertyChange("horario", oldHorario, horario);
    }

    /**
     * Retorna o Id
     *
     * @return
     */
    public int getId() {
        return id;
    }

    /**
     * Seta o Id
     *
     * @param id
     */
    public void setId(int id) {
        int oldId = this.id;
        this.id = id;
        changeSupport.firePropertyChange("id", oldId, id);
    }

    /**
     * Adicionar aluno na turma
     *
     * @param falta
     */
    public void adicionarAlunoNaTurma(Faltas falta) {
        faltas.add(falta);
    }

    /**
     * Retorna uma String contendo informações gerais de Turma
     *
     * @return
     */
    @Override
    public String toString() {
        return ("Disciplina:  " + this.disciplina.getNome() + "    Ano: " + this.ano + "   Periodo: " + this.periodo + "    Numero de vagas: " + this.numeroVagas);
    }
}
